home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / elk-2_0.lha / elk-2.0 / src / stab.coff.c < prev    next >
C/C++ Source or Header  |  1992-10-23  |  1KB  |  54 lines

  1. #include <filehdr.h>
  2. #include <syms.h>
  3. #undef TYPE         /* ldfnc.h defines a TYPE macro. */
  4. #include <ldfcn.h>
  5.  
  6. SYMTAB *Snarf_Symbols (lf, ep) LDFILE *lf; {
  7.     SYMTAB *tab;
  8.     register SYM *sp, **nextp;
  9.     SYMENT sym;
  10.     long inx;
  11.     char *p;
  12.     extern char *ldgetname();
  13.  
  14.     if (ldtbseek (lf) == FAILURE) {
  15.     ldclose (lf, NULL);
  16.     Primitive_Error ("can't ldtbseek");
  17.     }
  18.     tab = (SYMTAB *)Safe_Malloc (sizeof (SYMTAB));
  19.     tab->first = 0;
  20.     tab->strings = 0;
  21.     nextp = &tab->first;
  22.     while (1) {
  23.     inx = ldtbindex (lf);
  24.     if (ldtbread (lf, inx, &sym) == FAILURE)
  25.         break;
  26.     if (sym.n_scnum == N_UNDEF || sym.n_scnum == N_DEBUG
  27.         || sym.n_scnum > HEADER(lf).f_nscns || sym.n_sclass != C_EXT)
  28.         continue;
  29.     if ((p = ldgetname (lf, &sym)) == NULL)
  30.         continue;
  31.     sp = (SYM *)Safe_Malloc (sizeof (SYM));
  32.     sp->name = Safe_Malloc (strlen (p) + 1);
  33.     strcpy (sp->name, p);
  34.     sp->value = sym.n_value;
  35.     *nextp = sp;
  36.     nextp = &sp->next;
  37.     *nextp = 0;
  38.     }
  39.     return tab;
  40. }
  41.  
  42. #ifdef INIT_OBJECTS
  43. SYMTAB *Open_File_And_Snarf_Symbols (name) char *name; {
  44.     LDFILE *f;
  45.     SYMTAB *tab;
  46.  
  47.     if ((f = ldopen (name, NULL)) == FAILURE)
  48.     Primitive_Error ("can't ldopen a.out file");
  49.     tab = Snarf_Symbols (f);
  50.     ldclose (f);
  51.     return tab;
  52. }
  53. #endif /* INIT_OBJECTS */
  54.